package busterminal.entity;

import busterminal.entity.service.DaysOfWeek;
import busterminal.entity.service.Time;
import busterminal.exception.BusinessException;
import java.util.List;

/**
 * Интерфейс "Пункт расписания"
 */
public interface ScheduledItem extends AbstractEntity {

    /**
     * Получить время прибытия
     * @return время прибытия
     */
    public Time getArrivalTime();

    /**
     * Установить время прибытия
     * @param arrivalTime время прибытия
     */
    public void setArrivalTime(Time arrivalTime);

    /**
     * Получить время прибытия на автовокзал
     * @return время прибытия на автовокзал
     */
    public Time getArrivalTimeToBusTerminal();

    /**
     * Установить время прибытия на автовокзал
     * @param arrivalTimeToBusTerminal время прибытия на автовокзал
     */
    public void setArrivalTimeToBusTerminal(Time arrivalTimeToBusTerminal);

    /**
     * Получить время отправления
     * @return время отправления
     */
    public Time getDepartureTime();

    /**
     * Установить время отправления
     * @param departureTime время отправления
     */
    public void setDepartureTime(Time departureTime);

    /**
     * Получить время отправления с конечного пункта
     * @return время отправления с конечного пункта
     */
    public Time getDepartureTimeFromEndPoint();

    /**
     * Установить время отправления с конечного пункта
     * @param departureTimeFromEndPoint время отправления с конечного пункта
     */
    public void setDepartureTimeFromEndPoint(Time departureTimeFromEndPoint);

    /**
     * Получить номер платформы, с которой будет отправляться автобус по определённому маршруту
     * @return номер платформы, с которой будет отправляться автобус по определённому маршруту
     */
    public int getPlatformNumber();

    /**
     * Установить номер платформы, с которой будет отправляться автобус по определённому маршруту
     * @param platformNumber номер платформы, с которой будет отправляться автобус по определённому маршруту
     */
    public void setPlatformNumber(int platformNumber);

    /**
     * Получить маршрут, по которому осуществляется рейс
     * @return маршрут, по которому осуществляется рейс
     */
    public Route getRoute();

    /**
     * Установить маршрут, по которому осуществляется рейс
     * @param route маршрут, по которому осуществляется рейс
     */
    public void setRoute(Route route);

    /**
     * Получить дни недели осуществления рейсов по маршруту
     * @return дни недели осуществления рейсов по маршруту
     */
    public List<DaysOfWeek> getRoutingDays();

    /**
     * Получить строку, содержащую дни недели осуществления рейсов по маршруту
     * @return строку, содержащая дни недели осуществления рейсов по маршруту
     */
    public String getRoutingDaysString();

    /**
     * Установить дни недели осуществления рейсов по маршруту
     * @param routingDays дни недели осуществления рейсов по маршруту
     */
    public void setRoutingDays(List<DaysOfWeek> routingDays);

    /**
     * Получить время в пути
     * @return время в пути
     */
    public Time getTravelTime();

    /**
     * Установить время в пути на основе времени прибытия и отправления
     * @throws BusinessException время отправления позже времени прибытия
     */
    public void setTravelTime() throws BusinessException;
}
